vue+Element+vue-i18n实现国际化

我们公司之前老项目开发时候用中文,上线就手动改为英文,十分之麻烦,然后重新做了前后端分离版本的就想着弄个语言切换这样开发时候我也能方便,上线也不至于一个个修改,本着这样目的做了国际化处理(中间含遇错及修改)。
技术栈主要是vue,选的语言工具依赖包是vue-i18n

  1. 首先,安装vue-I18n
npm install vue-i18n -save
  1. 接着在vue项目src文件夹下新建一个 i18n 文件夹存放i18n要用的文件
    i18n.png

    \color{#0580CF} {lang文件夹里存放需要的语言包,index.js文件配置i18n}
//index.js
import VueI18n from "vue-i18n"; //引入vue-i18n
import enLang from "element-ui/lib/locale/lang/en"; // 英文
import zhLang from "element-ui/lib/locale/lang/zh-CN"; // 中文
import ptLang from "element-ui/lib/locale/lang/pt"; // 葡萄牙语
import Vue from "vue";
Vue.use(VueI18n);
let locale;
localStorage.getItem("lang")
  ? (locale = localStorage.getItem("lang"))
  : (locale = "zh");
const i18n = new VueI18n({
  locale, // 语言标识
  messages: {
    zh: Object.assign(require("./lang/zh"), zhLang), // 中文语言包
    en: Object.assign(require("./lang/en"), enLang), // 英文语言包
    pt: Object.assign(require("./lang/pt"), ptLang), // 葡萄牙语言包
  },
});

export default i18n;
//lang/en.js
module.exports = {
  //登录页面所需数据
  login: {
    username: "username",
    password: "password",
  },
  moreActions: {
    tit: "More actions",
    closeOther: "Close other",
    closeLeft: "Close left",
    closeRight: "Close right",
    closeAll: "Close all",
  },
};
//lang/zh.js
module.exports = {
  //登录页面所需数据
  login: {
    username: "用户名",
    password: "密码",
  },
  moreActions: {
    tit: "更多操作",
    closeOther: "关闭其他",
    closeLeft: "关闭左侧",
    closeRight: "关闭右侧",
    closeAll: "全部关闭",
  },
};

其实也可以写json,不过json的注释方式我不喜欢我就用了js,大家根据自己需求来定即可。

  1. 然后main.js引入
import Vue from "vue";
import App from "./App.vue";
import router from "./router";
import store from "./store";
import i18n from "./i18n"; //引入i18n

import "./plugins";
Vue.config.productionTip = false;
new Vue({
  router,
  i18n,
  store,
  render: (h) => h(App),
}).$mount("#app");

运行报错:
\color{red} {Uncaught TypeError: Cannot read properties of undefined(reading 'install')}

i18n_error.png

出现这种情况是由于vue-cli和i18n版本不匹配导致的,检查发现此时安装的i18n版本为9.1.10
edition.png

后将其改为8.x,刷新,原先错误消失,又有个新的报错
\color{red} {no\ such\ file\ or\ directory, open\ '/node\_modules/vue-i18n/dist/vue-i18n.esm-bundler.js'}
文件查找不到,检查发现是我vue.config.js多写了个打包,删掉后重新运行,错误消失。

  1. 接着配置Element 国际化,我这个项目是把Element单独写的文件,没有在入口文件编写,大家根据个人实际情况编写即可
import Vue from "vue";
import i18n from "../i18n"; //引入i18n
import ElementUI from "element-ui";
import "element-ui/lib/theme-chalk/display.css";
import "@/styles/element-variables.scss";
Vue.use(ElementUI, {
  i18n: (key, value) => i18n.t(key, value),
  size: "small",
});

此时控制台出现警告⚠️
\color{#5B3B01} {Value\ of\ key\ 'el.xx.xx'\ is\ not\ a \ string\ or\ function\ ! }

warn.png

在i18n配置文件中设置:silentTranslationWarn: true(去除国际化警告),OK,警告消失。

但是上面的那些我们都是配置,如果没有切换/选择语言那我们做的这些其实也没多大意义。没有操作何来执行呢对吧

<template>
  <el-dropdown @command="handleCommand">
    <span class="el-dropdown-link">
      {{ language }}<i class="el-icon-arrow-down el-icon--right"></i>
    </span>
    <el-dropdown-menu slot="dropdown">
      <el-dropdown-item command="zh">中文</el-dropdown-item>
      <el-dropdown-item command="en">English</el-dropdown-item>
      <el-dropdown-item command="pt">Portuguese</el-dropdown-item>
    </el-dropdown-menu>
  </el-dropdown>
</template>
<script>
const localeLang = new Map([
  ["zh", "中文"],
  ["en", "English"],
  ["pt", "Portuguese"],
]);
export default {
  name: "ChannelSelected",
  data() {
    return {
      language: "",
    };
  },
  methods: {
    // 根据下拉框的中被选中的值切换语言
    handleCommand(command) {
      this.language = localeLang.get(command);
      this.$i18n.locale = command;
      window.localStorage.setItem("lang", command);
      window.location.reload();
    },
  },
  created() {
    this.language = localeLang.get(this.$i18n.locale);
  },
};
</script>
<style lang="scss">
.el-dropdown-link {
  margin-right: 15px;
  &:hover {
    cursor: pointer;
  }
}
</style>

vue-i18n 数据渲染的模板语法:

//vue组件模板的使用
<div>{{$t("moreActions.tit")}}</div>

//vue组件模板数据绑定的使用
<input :placeholder="$t('moreActions.tit')"></input>

//vue组件data中赋值的使用
data:{
   tit:this.$t("moreActions.tit");
}
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 159,569评论 4 363
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,499评论 1 294
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 109,271评论 0 244
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 44,087评论 0 209
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,474评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,670评论 1 222
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,911评论 2 313
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,636评论 0 202
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,397评论 1 246
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,607评论 2 246
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,093评论 1 261
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,418评论 2 254
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,074评论 3 237
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,092评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,865评论 0 196
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,726评论 2 276
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,627评论 2 270

推荐阅读更多精彩内容